package cn.zane.types.design.framework;

import cn.zane.types.design.framework.tree.StrategyHandler;
import cn.zane.types.design.framework.tree.StrategyMapper;
import lombok.Getter;
import lombok.Setter;

/**
 * @author: zane
 * @date: 2025-10-24
 * @description: 策略路由器
 */
public abstract class AbstractStrategyRouter<T, D, R> implements StrategyMapper<T, D, R>, StrategyHandler<T, D, R> {

    @Getter
    @Setter
    protected StrategyHandler<T, D, R> defaultStrategyHandler = StrategyHandler.DEFAULT;

    public R router(T requestParameter, D dynamicContext) throws Exception {
        StrategyHandler<T, D, R> strategyHandler = get(requestParameter, dynamicContext);
        if (null != strategyHandler) {
            return strategyHandler.apply(requestParameter, dynamicContext);
        }
        return defaultStrategyHandler.apply(requestParameter, dynamicContext);
    }

}
